<?php

class Application_View_Helper_Keywords {
	private $word_length_min=3;// минимальное слово
	private $words_count=10;// количество ключевых слов
	private $meta=false;// true - возвращает готовый мета тег, иначе будет массив
	public function keywords($_text) { 
		$search=array ("'ё'",
		"'<script[^>]*?>.*?</script>'si", // Вырезается javascript
		"'<[\/\!]*?[^<>]*?>'si", // Вырезаются html-теги
		"'([\r\n])[\s]+'", // Вырезается пустое пространство
		// Замещаются html-элементы
		"'&quot;'i", "'&amp;'i","'&lt;'i","'&gt;'i","'&nbsp;'i","'&gt;'i","'&lt;'i","'raquo;'i","'laquo;'i",
		"'&iexcl;'i","'&cent;'i","'&pound;'i","'&copy;'i","'&#(\d+);'e");
		$replace=array('е',' ',' ',"\\1 ",'" ',' ',' ',' ',' ',
		chr(161),chr(162),chr(163),chr(169),"chr(\\1)");
		
		$text=preg_replace($search,$replace,$_text);// избавляемся в тексте от всякой html фигни
		// по каким то причинам жопы в preg_match_all приходится извращаться с кодировкой
		// отбираем из текст слова (из кодирвоки cp1251)
		preg_match_all("#(\w+)#si",iconv('UTF-8','cp1251',$text),$words_all);
		// массив стоп слов, которые включать по любасу не нужно
		$words_stop=array('','как','для','что','или','это','этих','всех','вас',
		'они','оно','еще','когда','где','эта','лишь','уже','вам','нет','если','надо','все',
		'так','его','чем','при','даже','мне','есть','раз','два','аля','нас','тем','через','многие','многое');
		$kk=array(); $cc=array(); $ii=0;// временные переменные
		$words_count=sizeof($words_all[0]);// узнаем общее количество слов в тексте
		for($it=0;$it<$words_count;$it++)// пройтись по всем словам
		{ // преобразуем все к маленькому регистру, ибо поисковички все равно регистры не отличают
		$val_win=strtolower($words_all[0][$it]);
		
		$len=strlen($val_win);// определяем длину слова
		// если слово меньше минимума, то не включаем в список подсчета
		if ($len<$this->word_length_min) { continue; }
		
		$val_utf=iconv('cp1251','UTF-8',$val_win);// конвертируемся обратно в utf
		
		// если слово является стоп словом, то не включаем в нужный список
		if (array_search($val_utf,$words_stop)) { continue; }
		
		$id=array_search($val_utf,$kk);// проверка на наличие слова уже в списке
		if ($id>0)// если в списке уже есть, то
		{ $cc[$id]++;// увеличиваем количество
		}
		else// если нет в списке
		{ $kk[$ii]=$val_utf;// записываем слово
		$cc[$ii]=1;// кол-во в тексте
		$ii++;
		}
		}
		// преобразуем весь результат к единому массиву
		$c=sizeof($kk); for($it=0;$it<$c;$it++) { $ww[$kk[$it]]=$cc[$it]; }
		
		arsort($ww);// сортируем массив по кол-ву слов
		$keywords=array();
		$it=0;
		foreach ($ww as $val=>$key)
		{ if ($it>=$this->words_count) { break; }
		$keywords[$it]=$val;
		$it++;
		}
		if ($this->meta)
		{ $c=sizeof($keywords);
		//$r='<meta name="keywords" content="';
		for($it=0;$it<$c;$it++)
		{ if (($it+1)==$c) { $r.=$keywords[$it]; } else { $r.=$keywords[$it].', '; }
		}
		//$r.='" />';
		}
		else
		{ $r=$keywords;
		}
		return $r;
	}
}